package com.littleHan.brushQuestions.web.userCenter.service;

import com.littleHan.brushQuestions.exception.*;
import com.littleHan.brushQuestions.web.start.pojo.DicValue;
import com.littleHan.brushQuestions.web.start.pojo.GeneralUser;
import com.littleHan.brushQuestions.web.start.pojo.Role;
import com.littleHan.brushQuestions.web.userCenter.pojo.Announcement;
import com.littleHan.brushQuestions.web.userCenter.pojo.DicType;
import com.littleHan.brushQuestions.web.userCenter.pojo.Pagination;
import com.littleHan.brushQuestions.web.userCenter.pojo.vo.GeneralUserRoleVo;
import com.littleHan.brushQuestions.web.userCenter.pojo.vo.SearchVo;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;
import java.util.Map;

public interface AdminUserCenterService {

    /**
     * 获取普通用户列表可分页
     * @param pagination 分页实例
     * @return
     */
    Map<String,Object> getGeneralUserList(Pagination pagination);

    /**
     * 修改用户封禁状态
     * @param generalUser 携带封禁状态和普通用户id的实例
     */
    void banAndLift(GeneralUser generalUser)throws FailedToUpdateException;

    /**
     * 获取权限列表
     * @return
     */
    List<Role> getRoleList();

    /**
     * 获取当前普通用户的已有的权限
     * @param id 普通用户id
     * @return
     */
    List<String> getGeneralUserRole(String id) throws FailedToLoadException;

    /**
     * 修改当前用户的权限
     * @param generalUserRoleVo 携带当前普通用户id和权限列表
     */
    void updateGeneralUserRole(GeneralUserRoleVo generalUserRoleVo)throws FailedSettingException;

    /**
     * 获取审核员对象
     * @param pagination 分页对象
     * @return
     */
    Map<String, Object> getAuditorList(Pagination pagination);

    /**
     * 根据roleId和昵称以及用户名搜索满足条件的用户
     * @param searchVo 携带roleId和搜索内容的实例
     * @return
     */
    Map<String, Object> searchGeneralUser(SearchVo searchVo);

    /**
     * 获取数据字典中题的类型
     * @param pagination 分页对象
     * @return
     * @throws FailedToLoadException
     */
    Map<String, Object> getDicType(Pagination pagination)throws FailedToLoadException;

    /**
     * 获取数据字典中题的难度等级
     * @param pagination 分页对象
     * @return
     * @throws FailedToLoadException
     */
    Map<String, Object> getDicDifficult(Pagination pagination)throws FailedToLoadException;

    /**
     * 获取数据字典中的科目
     * @param pagination 分页对象
     * @return
     * @throws FailedToLoadException
     */
    Map<String, Object> getDicObject(Pagination pagination)throws FailedToLoadException;

    /**
     * 修改数据字典
     * @param dicValue 数据字典值对象
     */
    void updateDicValue(DicValue dicValue)throws FailedToUpdateException;

    /**
     * 根据数据字典id删除数据字典值，（要经过验证，题目表中是否有题目已经绑定了该类型，如果绑定了就不能删除了）
     * @param id 数据字典值id
     */
    String deleteDicValue(String id) throws FailedToDeleteException;

    /**
     * 获取数据字典类型列表
     * @return
     */
    List<DicType> getDicTypeList();

    /**
     * 添加数据字典值
     * @param dicValue 数据字典对象
     */
    void addDicValue(@RequestBody DicValue dicValue) throws FailedToInsertException;

    /**
     * 获取公告信息
     * @param pagination 分页对象
     * @return
     */
    Map<String,Object> getAnnouncementList(Pagination pagination);

    /**
     * 根据公告的id删除公告信息
      * @param announcement 携带公告id的公告实例
     */
    void deleteAnnouncement(Announcement announcement) throws FailedToDeleteException;

    /**
     * 添加公告
     * @param announcement 携带公告内容的公告
     * @throws FailedToInsertException
     */
    void addAnnouncement(Announcement announcement) throws FailedToInsertException;
}
